/**
 * DataURL转成File对象
 * @param {String} dataurl 传入的文件base64编码
 * @param {String} filename 文件名
 * @param {String} type 文件类型
 */

const dataURLtoFile = (dataurl = "", filename = "file", type = "") => {
    let arr = dataurl.split(",");
    let bstr = atob(arr[1]);
    !type && (type = arr[0].replace("data:", "").replace(";base64", ""));
    let n = bstr.length,
        u8arr = new Uint8Array(n);

    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], filename, {
        type,
    });
};

/**
 * DataURL转化为Blob对象
 * @param {String} dataurl
 */

const dataURLToBlob = (dataurl = "") => {
    let arr = dataurl.split(",");
    let bstr = atob(arr[1]);
    let n = bstr.length,
        u8arr = new Uint8Array(n);

    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr]);
};

/**
 * 将Blob转换成File文件
 * @param {Blob} blob
 * @param {String} filename
 * @param {String} type
 */

const blobToFile = (blob, filename = "file", type = "") => {
    !type && console.error("请传入转化文件的类型type!!!");

    return new File([blob], filename, {
        type,
    });
};

/**
 * File对象或者Blob对象转换为DataUrl
 * @param {File | Blob} fileOrBlob
 *
 */

const fileOrBlobToDataURL = fileOrBlob => {
    let fileReader = new FileReader();

    fileReader.readAsDataURL(fileOrBlob); //读取文件内容，结果用data:url的字符串形式表示

    return new Promise((resolve, reject) => {
        fileReader.onload = e => {
            resolve(e.target.result);
        };
        fileReader.onerror = err => {
            reject(err);
        };
    });
};

/**
 *  Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取，
 *  也可以转换成 ReadableStream 来用于数据操作。 通常可以用于声音、视频等多媒体文件的存储；
 */

/**
 * File转化成Blob对象
 * @param {File} file
 */

const fileToBlob = file => {
    let fileReader = new FileReader();
    fileReader.readAsArrayBuffer(file);
    return new Promise((resolve, reject) => {
        fileReader.onload = e => {
            resolve(
                new Blob([e.target.result], {
                    type: file.type,
                })
            );
        };
        fileReader.onerror = err => {
            reject(err);
        };
    });
};

export {
    blobToFile,
    dataURLtoFile,
    fileToBlob,
    fileOrBlobToDataURL,
    dataURLToBlob,
}